grammar ReducedBL;
@header{
package com.fy.tt.parser;
}

// 语法规则
atomicScript: (stmt | controller)+ ;

// 即时型、监听型、定时型（轮询型）
stmt: runToolStmt | listenStmt | scheduleStmt;

// 1.即时型 如：张三在喇叭帮区执行喇叭工具的发声部件。
runToolStmt: Char+ At (Char+ Band|ThisBand) Run Char+ Tool_s Char+ Componment (Comma|(Comma paramStmt)+ Comma) Return Char+ Dot;
// 定义工具部件参数
paramStmt: ParamName Is Char+ | Char+ Is Char+ ;

// 2.监听型
//监听型语句，如：当 在xx帮区 监听到 消息总线 设备故障 消息的类型，则 张三 在 xx帮区 执行 消息板工具 ，消息板为XXX，消息内容为XXX。
listenStmt: When place Listen MessageBus Char+ TypeSMessage Comma Then triggerStmt;
triggerStmt: notifyStmt | runToolStmt;
notifyStmt: Char+ At (Char+ Band|ThisBand) Run ChatTool Comma ChatRoom Is Char+ Comma MsgContent Is Char+  Dot;
place: At Char+ Band ;


// 3.定时型
// (1) 周期
// 如：每1天8点，张三 在 喇叭 帮区 执行 喇叭 工具的 发声 部件，喇叭id为xx。
// (2) 延时
// 如：2小时 之后，张三 在 喇叭 帮区 执行 喇叭 工具的 发声 部件，喇叭id为xx。
scheduleStmt: timeAdverbial Comma runToolStmt | listenStmt;
timeAdverbial: period | delay;
period: Every Char+;
delay: Char+ After;


// 业务指令集（设置变量、获取变量、条件控制）
controller: (setStmt | ifStmt)+?;

// 设置变量
setStmt: returnStmt | envStmt ;
returnStmt: runToolStmt;
envStmt: Set Char+ Is Char+ (Dot|(Comma Char+ Is Char+)+ Dot);

// 获取变量

// 条件控制
ifStmt: If conditionStmt Comma Then runToolStmt;
conditionStmt: Char+ Operate Char+;

Set: '设置';
If: '如果';
Operate: '大于' | '等于' | '小于';


// 词法规则
Return: '返回结果为';
At: '在';
Band: '帮区';
ThisBand: '当前帮区';
Run: '执行' | '调用';
Tool_s: '工具的';
Componment: '部件';
ParamName: '名称' | '内容' | '等等规范的工具部件参数名称';
Is: '为';
When: '当';
Listen: '监听到';
MessageBus: '消息总线';
TypeSMessage: '消息的类型';
Then: '则';
ChatTool: '消息板工具';
ChatRoom: '消息板';
MsgContent: '消息内容';

After: '之后' | '后';
Every: '每';


Comma: ',' | '，';
Dot :'.'|'。';
Char: ([a-zA-Z0-9$_] | [\u4E00-\u9FA5]);

Ws :[ \t\r\n]+ -> skip;
Comment :'//' ~[\r\n]* -> channel(HIDDEN);